home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Gigantic Games 2
/
Gigantic Games 2.iso
/
pc
/
_a_
/
abitur
/
txt
/
abitur.mod
next >
Wrap
Text File
|
1994-12-23
|
9KB
|
324 lines
MODULE Abitur;
FROM Fragen IMPORT Bewerte, SearchRNDFrage, FragePtr, SchuelerAntwort;
FROM AbiturScreen IMPORT AddAbiTxtLin, ShowAbiTxt, weisS, blaU;
FROM FaecherNamen IMPORT FaecherTypen, FaecherNamen;
FROM InitialisiereSpieler IMPORT InitPlayers;
FROM Aktionen IMPORT SpielAktion, GetAktion;
(* FROM InOut IMPORT WriteString, WriteLn; *)
FROM StundenPlan IMPORT ZeigePlan, ClosePlanFenster, Zeit, GetFach,
Plaene, IncTime;
FROM Zeugnis IMPORT ZeigSchuelerZeugnis;
FROM Globals IMPORT SpielerPtr, AlleSpieler, AnzahlSpieler;
FROM RealConversions IMPORT RealToStr;
FROM IntuFrage IMPORT IntuFrag;
FROM Intuition IMPORT WindowPtr;
FROM Graphics IMPORT Text, Move, SetAPen;
FROM SYSTEM IMPORT ADR;
FROM Str IMPORT Length;
FROM RandomNumber IMPORT RND;
FROM RandomNoten IMPORT RNDNote;
FROM BerechneSchnitt IMPORT BerechneSchnitt;
FROM NoteConversions IMPORT NoteToString;
FROM Bammel IMPORT ShowRNDBammelText;
FROM FachLehrer IMPORT ShowLehrerText;
FROM SaveLoad IMPORT SaveAktGame, LoadAGame;
FROM Menus IMPORT RefreshSpielerMenu;
PROCEDURE AlleHabenAbsolviert(): BOOLEAN;
VAR AktS: SpielerPtr;
BEGIN
AktS := AlleSpieler;
WHILE AktS # NIL DO
IF AktS^.Jahr < 5 THEN
RETURN FALSE
END;
AktS := AktS^.Next
END;
RETURN TRUE
END AlleHabenAbsolviert;
PROCEDURE FindWorst(): SpielerPtr;
(* Gibt nil zurück, wenn alle durchgefallen *)
VAR Akt, Wor: SpielerPtr;
W : REAL;
BEGIN
Akt := AlleSpieler;
W := 7.0;
WHILE Akt # NIL DO
IF (W > Akt^.Zeugnis.GesammtSchnitt) AND (Akt^.Jahr # 6) THEN
W := Akt^.Zeugnis.GesammtSchnitt;
Wor := Akt
END;
Akt := Akt^.Next
END;
IF W = 7.0 THEN
(* Alle Durchgefallen *)
RETURN NIL
ELSE
RETURN Wor
END
END FindWorst;
PROCEDURE Bewertung;
VAR SP: SpielerPtr;
str: ARRAY [0..36] OF CHAR;
BEGIN
SP := FindWorst();
IF SP # NIL THEN
(* Es existiert ein schlechtester Abslovent *)
AddAbiTxtLin("Sieger ist : ");
AddAbiTxtLin(SP^.Name);
AddAbiTxtLin("mit der Note:");
NoteToString(SP^.Zeugnis.GesammtSchnitt , TRUE, str);
AddAbiTxtLin(str)
ELSIF AnzahlSpieler > 0 THEN
AddAbiTxtLin("Alle sind durchgefallen");
AddAbiTxtLin("");
AddAbiTxtLin("Es gibt keinen Gewinner")
ELSE
AddAbiTxtLin(" Keine Spieler ")
END;
ShowAbiTxt(weisS)
END Bewertung;
PROCEDURE FindRNDSchuel(VAR S: SpielerPtr): BOOLEAN;
(* Gibt nur FALSE zurück, wenn alle absolviert haben *)
VAR IncCount: INTEGER;
BEGIN
S := NIL;
IF AlleHabenAbsolviert() THEN RETURN FALSE END;
IncCount := RND(40);
S := AlleSpieler;
WHILE S^.Jahr >= 5 DO
S := S^.Next
END;
WHILE IncCount > 0 DO
S := S^.Next;
IF S = NIL THEN S := AlleSpieler END;
WHILE S^.Jahr >= 5 DO
S := S^.Next;
IF S = NIL THEN S := AlleSpieler END
END;
DEC (IncCount)
END;
RETURN TRUE
END FindRNDSchuel;
PROCEDURE Bilanz;
VAR SPtr: SpielerPtr;
Fach: FaecherTypen;
BEGIN
IF AlleHabenAbsolviert() THEN
Bewertung
ELSE
SPtr := AlleSpieler;
WHILE SPtr # NIL DO
IF SPtr^.Jahr < 5 THEN
INC(SPtr^.Jahr)
END;
BerechneSchnitt(SPtr); (* Neue Vornote und Schnitt *)
FOR Fach := Turnen TO Informatik DO
SPtr^.Zeugnis.AktuelleSumme[Fach] := 0.0;
SPtr^.Zeugnis.AnzInSumme[Fach] := 0
END;
IF ODD(SPtr^.Provisorisch) THEN
(* Schüler(in) ist Provi *)
IF (SPtr^.Zeugnis.GesammtSchnitt < 3.75) OR
(SPtr^.Absenzen > 3) THEN
(* Repetieren *)
IF SPtr^.Jahr > 1 THEN DEC(SPtr^.Jahr) END
END;
INC(SPtr^.Provisorisch);
IF SPtr^.Provisorisch >= 6 THEN
SPtr^.Jahr := 6 (* Herausgefallen *)
END
ELSE (* Kein(e) Provi *)
IF (SPtr^.Zeugnis.GesammtSchnitt < 3.75) OR
(SPtr^.Absenzen > 3) THEN
(* Wird Provi *)
INC(SPtr^.Provisorisch)
END
END;
SPtr^.Absenzen := 0;
FOR Fach := Turnen TO Informatik DO
SPtr^.Zeugnis.VorNote[Fach] := SPtr^.Zeugnis.Schnitt[Fach]
END;
SPtr := SPtr^.Next
END;
IF NOT AlleHabenAbsolviert() THEN
AddAbiTxtLin("Ein Neues Schuljahr bricht");
AddAbiTxtLin("an. Lernt eure Zeugnise");
AddAbiTxtLin("auswendig.");
ShowAbiTxt(weisS)
END
END
END Bilanz;
PROCEDURE BammelPause(S: SpielerPtr);
BEGIN
IF RND(3) = 1 THEN (* Hier Absenz *)
AddAbiTxtLin("Warum hat wohl");
AddAbiTxtLin(S^.Name);
AddAbiTxtLin("letzthin wieder mal gefehlt?");
ShowAbiTxt(weisS);
INC(S^.Absenzen)
ELSIF (RND(5) = 1) AND (S^.ErfahrungsNoteGs <= 5.0) THEN
(* Hier Geschichte + 1 *)
AddAbiTxtLin("Hey !!!");
AddAbiTxtLin(S^.Name);
AddAbiTxtLin("der Geschichtslehrer hat");
AddAbiTxtLin("Dich im Schulorchester");
AddAbiTxtLin("erspäht. Deine Note in");
AddAbiTxtLin("Geschichte steigt diskret");
AddAbiTxtLin("um einen Punkt!");
ShowAbiTxt(blaU);
S^.ErfahrungsNoteGs := 1.0 + S^.ErfahrungsNoteGs;
S^.Zeugnis.VorNote[Geschichte] := 1.0 +
S^.Zeugnis.VorNote[Geschichte]
ELSE (* Hier Bammel *)
ShowRNDBammelText
END
END BammelPause;
PROCEDURE NormaleStunde(S:SpielerPtr);
VAR Fach: FaecherTypen;
Fr: FragePtr;
Str: ARRAY[0..255] OF CHAR;
Ant: SchuelerAntwort;
Note: REAL;
BEGIN
Fach := GetFach(S^.Jahr);
Fr := SearchRNDFrage(Fach);
IF Fr # NIL THEN
BerechneSchnitt(S);
AddAbiTxtLin("Stunde: ");
AddAbiTxtLin(FaecherNamen[Fach].VollName);
AddAbiTxtLin("Der Lehrer will es von:");
AddAbiTxtLin(S^.Name);
AddAbiTxtLin("wissen !");
AddAbiTxtLin(" ");
AddAbiTxtLin("NotenSchnitt:");
NoteToString(S^.Zeugnis.GesammtSchnitt, TRUE, Str);
AddAbiTxtLin(Str);
ShowAbiTxt(weisS);
IntuFrag(Fr, Ant);
(* Notengebung : *)
IF Fach = Geschichte THEN
Note := S^.ErfahrungsNoteGs
ELSIF Fach = Turnen THEN
Note := S^.SympathieNoteTurnen
ELSIF Fach = Geographie THEN
Note := RNDNote()
ELSE
Note := Bewerte(Fr, Ant)
END;
AddAbiTxtLin("Note:");
NoteToString(Note, FALSE, Str);
AddAbiTxtLin(Str);
ShowAbiTxt(weisS);
INC(S^.Zeugnis.AnzInSumme[Fach]);
S^.Zeugnis.AktuelleSumme[Fach] :=
S^.Zeugnis.AktuelleSumme[Fach] + Note;
IF Plaene[S^.Jahr].Bele[Zeit.Tag, Zeit.Stunde].MaturFach THEN
INC(S^.Zeugnis.AnzInSumme[Fach]);
S^.Zeugnis.AktuelleSumme[Fach] :=
S^.Zeugnis.AktuelleSumme[Fach] + Note
END
END
END NormaleStunde;
VAR BillGezeigt: BOOLEAN;
PROCEDURE SchulFrage;
VAR S: SpielerPtr;
BEGIN (* SchulFrage *)
IF AlleHabenAbsolviert() THEN
Bewertung
ELSE
IF (Zeit.Tag = 0) AND (Zeit.Stunde = 8) AND (NOT BillGezeigt) THEN
Bilanz; BillGezeigt := TRUE
ELSIF FindRNDSchuel(S) THEN
IF RND(3) = 1 THEN
BammelPause(S); IncTime
ELSE
NormaleStunde(S);
IF AlleHabenAbsolviert() THEN
Bewertung
ELSE
IncTime
END
END;
BillGezeigt := FALSE
END
END
END SchulFrage;
VAR i, Param: INTEGER;
Aktio: SpielAktion;
Bool: BOOLEAN;
BEGIN (* Abitur *)
BillGezeigt := FALSE;
LOOP
GetAktion(Aktio, Param);
CASE Aktio OF
Ende : EXIT
| Save : IF AnzahlSpieler > 0 THEN
SaveAktGame
END
| Load : LoadAGame;
Bool := RefreshSpielerMenu()
| ZeigeStupl : ZeigePlan(Param)
| CloseAPlan : ClosePlanFenster(Param)
| NaechsteFrage: IF AnzahlSpieler > 0 THEN
SchulFrage
END
| ZeigFach : ShowLehrerText(FaecherTypen(Param))
| ZeigZeugnis : ZeigSchuelerZeugnis(Param)
| NeuesSpiel : FOR i := 1 TO 4 DO
ClosePlanFenster(i)
END;
InitPlayers;
Zeit.Tag := 0; Zeit.Stunde := 8
ELSE
END
END; (* Loop *)
FOR i := 1 TO 4 DO
ClosePlanFenster(i)
END
END Abitur.